package gestion.horarios.view.jsf.beans;

import gestion.horarios.controller.facade.GestionHorariosI;
import gestion.horarios.controller.facade.GestionHorarios;
import gestion.horarios.view.jsf.exceptions.GestionHorariosException;
import gestion.horarios.view.jsf.exceptions.RolNotExistsException;
import gestion.horarios.view.jsf.exceptions.UsuarioNotExistsException;
import gestion.horarios.model.jpa.entities.Rol;
import gestion.horarios.model.jpa.entities.Usuario;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

@ManagedBean (name="LOGIN") 
@SessionScoped
public class LoginManagedBean implements Serializable {
	private static final long serialVersionUID = 1L;
	private int usuarioId;
	private String apellidos;
	private String codigo;
	private String contrasena;
	private String estado;
	private String nombres;
	private String nombreUsuario;
	private Rol rol;
	private Integer rolSeleccionado = 0;
	private boolean mostrarRoles = false;
	private List<SelectItem> roles;
	private Usuario usuario;
	private FacesContext context;
	
	public LoginManagedBean(){
		super();
	}
	
	public String verificaLogin() {
		System.out.println("* * * Entra a verificaLogin " + nombreUsuario + " - " + contrasena);
		
		GestionHorariosI gh = new GestionHorarios();
		
		context = FacesContext.getCurrentInstance();
		
		try {
			
			if(rolSeleccionado == 0){
				setUsuario(gh.getUsuario(nombreUsuario, contrasena));
				setRoles(gh.getRoles(usuario.getUsuarioId()));
				setMostrarRoles(getUsuario()!=null);
			}
		} catch (UsuarioNotExistsException e) {
			System.out.println("* * * UsuarioNotExistsException * * *");
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"El UserID no existe","XX") );
			return "welcome";
		} catch (GestionHorariosException e) {
			System.out.println("* * * GestionarHorariosException * * *");
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"El password es incorrecto","YY") );
			return "welcome";
		}
		
		System.out.println("Sale de  verificaLogin");
		return "horarios";
	}

	public String menuPrincipal() {
		System.out.println("* * * Entra a menuPrincipal");
		
		GestionHorariosI gh = new GestionHorarios();
		context = FacesContext.getCurrentInstance();
		
		try {
			
			if(rolSeleccionado == 0){
				throw new GestionHorariosException(null);
			} else {
				setRol(gh.getRol(rolSeleccionado));
				return "menuPrincipal";
			}
		} catch (RolNotExistsException e) {
			System.out.println("* * * RolNotExistsException * * *");
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"El rolId no existe","XX") );
			return "welcome";
		} catch (GestionHorariosException e) {
			System.out.println("* * * GestionarHorariosException * * *");
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe seleccionar un Rol","YY") );
			return "welcome";
		}
	}

	public int getUsuarioId() {
		return usuarioId;
	}

	public void setUsuarioId(int usuarioId) {
		this.usuarioId = usuarioId;
	}

	public String getApellidos() {
		return apellidos;
	}

	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getContrasena() {
		return contrasena;
	}

	public void setContrasena(String contrasena) {
		this.contrasena = contrasena;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public String getNombres() {
		return nombres;
	}

	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	public String getNombreUsuario() {
		return nombreUsuario;
	}

	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<SelectItem> getRoles() {
		return roles;
	}

	public void setRoles(List<SelectItem> roles) {
		this.roles = roles;
	}

	public Rol getRol() {
		return rol;
	}

	public void setRol(Rol rol) {
		this.rol = rol;
	}

	public Integer getRolSeleccionado() {
		return rolSeleccionado;
	}

	public void setRolSeleccionado(Integer rolSeleccionado) {
		this.rolSeleccionado = rolSeleccionado;
	}

	public boolean isMostrarRoles() {
		return mostrarRoles;
	}

	public void setMostrarRoles(boolean mostrarRoles) {
		this.mostrarRoles = mostrarRoles;
	}
}
